package com.Proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Client {
    public static void main(String[] args) {
        Producer producer = new Producer();

        //创建代理对象：Proxy类中的newProxyInstance方法，被代理类至少实现一个接口
        //newProxyInstance中的参数
        /**
         *  ClassLoader : 被代理类对象类加载器(固定写法)
         *  Class[] ：让代理对象和被代理对象有相同的方法
         *  InvocationHandle : 写让我们如何代理，一般是写一个该接口实现类，通常情况下都是匿名内部类，但是不必须
         */
        IProducer proxyProducter = (IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(),
                producer.getClass().getInterfaces(), new InvocationHandler() {
                    /**
                     * 作用：执行被代理的对象的任何接口都会经过该方法
                     * @param proxy   代理对象的引用
                     * @param method  当前执行的方法
                     * @param args    当前执行方法所需的参数
                     * @return        和被代理对象有相同的返回值
                     * @throws Throwable
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //增强代码
                        //1.获取方法执行参数
                        Object returnValue = null;
                        float money = (float) args[0];
                        if("saleProduct".equals(method.getName())){
                            returnValue = method.invoke(producer,money*0.8f);
                        }
                        return returnValue;
                    }
                });

        /**
         * 1.初始化Bean
         *
         * 2.BeanNameAware
         *
         * 3.BeanFactoryAware
         *
         * 4.PostProcessBean  postProcessBeforeInitialization
         *
         * 5.InitializingBean  afterProperties
         *
         * 6.Init-method
         *
         * 7.PostProcessBean  postProcessAfterInitialization
         *
         * 8.DisposableBean destroy
         *
         * 9.destroy-method
         */

        /**
         *
         * SpringMVC生命周期
         *
         * 1.用户响应页面调用前端处理器DispatcherServlet
         *
         * 2.DispatcherServlet 调用 HandleMapping
         *
         * 3.HandleMapping返回拦截器对象和URL给 DispatcherServlet
         *
         * 4.DispatcherServlet 调用 HandleAdapter
         *
         * 5.HandleAdapter 调用 Handle 具体处理器
         *
         * 6.Handle 返回 ModelAndView 给HandleAdapter
         *
         * 7.HandleAdapter 将ModelAndView 返给 DispatcherServlet
         *
         * 8.DispatcherServlet 调用 ViewResolve
         *
         * 9.ViewResolve 返回 View
         *
         * 10.DispatcherServlet 对 View 渲染
         *
         * 11.DispatcherServlet 响应用户
         *
         */

        proxyProducter.saleProduct(100000f);
    }
}
